02|差分数组(Difference Array)(知识笔记)
对应课程:lessons/02-prefix-diff-two-pointers/01-difference-array.md
识别信号
- 有很多次区间更新(加/减/赋值变形),最后一次性输出
- 朴素对每次更新遍历区间会超时
一维差分(区间加)
- 定义:
diff[i] = a[i] - a[i-1],约定a[0]=0 - 对
[l,r]加x:diff[l] += xdiff[r+1] -= x(若 r+1 在范围内)
- 还原:
a[i] = a[i-1] + diff[i](对 diff 做前缀和)
二维差分(矩形加)
对 [x1..x2][y1..y2] 加 x:
d[x1][y1] += xd[x1][y2+1] -= xd[x2+1][y1] -= xd[x2+1][y2+1] += x最后对 d 做二维前缀和还原。
常见坑
- 越界:数组通常开到
n+2或m+2 - 多测忘记清空 diff
- 类型溢出:叠加次数多时用
long long
自检
- [ ] 做完更新后是否还原了?
- [ ] l=1 / r=n 的边界是否正确?
个人坑位
- (例)我经常忘记处理
r+1越界